/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.pucp.Maestros.DAO;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import pe.edu.pucp.Envios.DAO.VueloDAO;
import pe.edu.pucp.Modelo.Avion;
import pe.edu.pucp.Modelo.EstadoVuelo;
import pe.edu.pucp.Modelo.Vuelo;
import pe.edu.pucp.Util.HibernateUtil;
import pe.edu.pucp.Util.Utilitario;
/**
 *
 * @author oscar
 */
public class VueloCargaDAO {
    public void guardarVuelo(Vuelo c) {
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx =  session.beginTransaction();
        session.save(c);
        tx.commit();
        session.close();
    }
    
    public ArrayList<Vuelo> ObtenerVuelosRealizados()
    {       
        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction tx = session.beginTransaction();        
        
        List listaAvion = session.createQuery("select avion from Avion avion").list();
        ArrayList<Vuelo> salida = new ArrayList<Vuelo>();
        
        for ( Iterator iter = listaAvion.iterator(); iter.hasNext(); ) {    
            Avion avion = (Avion) iter.next();
            
            List<Vuelo> listaVueloMaximo = session.createQuery("select vuelo from Vuelo vuelo  where vuelo.llegadaest< :date and vuelo.avion.idavion=:avion  and idestado=1 order by llegadaest asc").setParameter("avion", avion.getIdavion()).setParameter("date", new Date()).list();
            
            List<Vuelo> listaVueloMInimo = session.createQuery("select vuelo from Vuelo vuelo  where vuelo.llegadaest< :date and vuelo.avion.idavion=:avion and idestado=1 order by salidaest desc").setParameter("avion", avion.getIdavion()).setParameter("date", new Date()).list();
            
            UltimoVuelo uv = new UltimoVuelo();            
            
                if(listaVueloMaximo.size()==0)
                {
                    continue;
                }else
                {
                    uv.setIdavion(avion.getIdavion());
                    Date d1 = ObtenerMaximoMInimo(listaVueloMInimo);
                    uv.setMax(d1);
                    Date d2 = ObtenerMaximoMInimo(listaVueloMaximo);
                    uv.setMin(d2);
                   
                }
                
                int desface=(int)(uv.getMax().getTime()-uv.getMin().getTime());

                for(Vuelo v :listaVueloMaximo) // tmb  puede ser listaVueloMinimo
                {
                    
                    Calendar fechaSalida = Calendar.getInstance();
                    fechaSalida.setTime(v.getSalidaest());
                    fechaSalida.add(Calendar.DAY_OF_YEAR,1+(desface/ (24*60*60*1000)));            
                    
                    Calendar fechaLlegada = Calendar.getInstance();
                    fechaLlegada.setTime(v.getLlegadaest());
                    fechaLlegada.add(Calendar.DAY_OF_YEAR,1+(desface/ (24*60*60*1000)));            
                                        
                    Vuelo g = new Vuelo();
                    
                    g.setAeropuertoByIddestino(v.getAeropuertoByIddestino());
                    g.setAeropuertoByIdorigen(v.getAeropuertoByIdorigen());
                    g.setAvion(v.getAvion());
                    g.setSalidaest(fechaSalida.getTime());
                    g.setLlegadaest(fechaLlegada.getTime());
                    g.setRecorrido(v.getRecorrido());
                    g.setCosto(v.getCosto());
                    
                    EstadoVuelo  e = new EstadoVuelo();
                    e.setIdestado(1);
                    g.setEstadoVuelo(e);
                    //g.setItinerarios(v.getItinerarios());
                    g.setNumpack(0);
                    
                    salida.add(g);
              }
        }        
        tx.commit();
        session.close();

        return salida;
    }    
    
        
    Date ObtenerMaximoMInimo(List<Vuelo> vuelos){
            return vuelos.get(0).getLlegadaest();
    }
    
}
class UltimoVuelo
{
    private int idavion;
    private Date max;
    private Date min;
        
    public UltimoVuelo()
    {
    }

    
    /**
     * @return the idavion
     */
    public int getIdavion() {
        return idavion;
    }

    /**
     * @param idavion the idavion to set
     */
    public void setIdavion(int idavion) {
        this.idavion = idavion;
    }

    /**
     * @return the max
     */
    public Date getMax() {
        return max;
    }

    /**
     * @param max the max to set
     */
    public void setMax(Date max) {
        this.max = max;
    }

    /**
     * @return the min
     */
    public Date getMin() {
        return min;
    }

    /**
     * @param min the min to set
     */
    public void setMin(Date min) {
        this.min = min;
    }
          
}


